0.1 Instalando e carregando o pacote distenceMonitoraflorestal

devtools::install_github("vntborgesjr/distanceMonitoraflorestal")
Downloading GitHub repo vntborgesjr/distanceMonitoraflorestal@HEAD
── R CMD build ──────────────────────────────────────────────────
  
  
  
✔  checking for file 'C:\Users\lufus\AppData\Local\Temp\RtmpcBAPTC\remotes54bc27022b3\vntborgesjr-distanceMonitoraflorestal-498e1ef/DESCRIPTION'

  
  
  
─  preparing 'distanceMonitoraflorestal':
   checking DESCRIPTION meta-information ...
  
   checking DESCRIPTION meta-information ... 
  
✔  checking DESCRIPTION meta-information

  
  
  
─  checking for LF line-endings in source and make files and shell scripts

  
─  checking for empty or unneeded directories

  
  
  
─  building 'distanceMonitoraflorestal_0.0.0.9000.tar.gz'

  
Warning in utils::tar(filepath, pkgname, compression = compression, compression_level = 9L,  :
  
   Warning in utils::tar(filepath, pkgname, compression = compression, compression_level = 9L,  :
     storing paths of more than 100 bytes is not portable:
     'distanceMonitoraflorestal/vignettes/Ajuste-dos-modelos-fluxo3-distancias-agrupadas-com-repeticoes.Rmd'

  
   Warning in utils::tar(filepath, pkgname, compression = compression, compression_level = 9L,  :
     storing paths of more than 100 bytes is not portable:
     'distanceMonitoraflorestal/vignettes/Ajuste-dos-modelos-fluxo4-amostragem-por-distancia-com-multiplas-covariaveis.Rmd'
   Warning in utils::tar(filepath, pkgname, compression = compression, compression_level = 9L,  :
     storing paths of more than 100 bytes is not portable:
     'distanceMonitoraflorestal/vignettes/Ajuste-dos-modelos-fluxo5-amostragem-por-distancia-estratificada-por-unidade-de-conservacao.Rmd'
   Warning in utils::tar(filepath, pkgname, compression = compression, compression_level = 9L,  :
     storing paths of more than 100 bytes is not portable:
     'distanceMonitoraflorestal/vignettes/Ajuste-dos-modelos-fluxo6-amostragem-por-distancia-estratificada-por-ano.Rmd'

  
   
Installing package into ‘C:/Users/lufus/AppData/Local/R/win-library/4.3’
(as ‘lib’ is unspecified)
* installing *source* package 'distanceMonitoraflorestal' ...
** using staged installation
** R
** data
*** moving datasets to lazyload DB
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (distanceMonitoraflorestal)
# 
library(distanceMonitoraflorestal)

0.1.1 Fluxo 5 - Amostragem por distância com estratificação por Unidade de Conservação

0.1.1.1 Explorando os dados dentro de cada estrato espacial:

0.1.2 Carregar Dados

# filtrar dados das cutias para as quatro UCS onde ocorre:
coata <- filtrar_dados(
  nome_sps = "ateles_marginatus",
  validacao_obs = "especie"
)

coata_distance <- transformar_dados_formato_Distance(
  coata,
  amostras_repetidas = TRUE)

coata_distance
0.1.2.0.1 Plotando o histograma das frequências de ocorrência pela distância
0.1.2.0.1.1 Dados Globais

Plotando o histograma para os dados globais.

coata_distance |> 
  tidyr::drop_na(distance) |> 
plotar_distribuicao_distancia_interativo(largura_caixa = 1)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Warning: Continuous y aesthetic
ℹ did you forget `aes(group = ...)`?
0.1.2.0.2 Ajustando modelos com covariável size
0.1.2.0.2.1 Half-Normal sem termos de ajuste e com termos de ajuste Cosseno e Polinomial de Hermite
# ajustando a função de detecção half-normal para um truncamento de 5% dos dados

coata_distance_hn <- coata_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    truncamento = "5%")
Fitting half-normal key function
AIC= 483.904
Starting AIC adjustment term selection.
Fitting half-normal key function
AIC= 483.904
Fitting half-normal key function with cosine(2) adjustments
Warning: Detection function is not strictly monotonic!AIC= 478.332
Fitting half-normal key function with cosine(2,3) adjustments
AIC= 502.836

Half-normal key function with cosine(2) adjustments selected.
Warning: Detection function is not strictly monotonic!Starting AIC adjustment term selection.
Fitting half-normal key function
AIC= 483.904
Fitting half-normal key function with Hermite(4) adjustments
AIC= 485.867

Half-normal key function selected.
coata_distance_hn$`Sem termo`

Distance sampling analysis object

Detection function:
 Half-normal key function 

Estimated abundance in covered region: 98.73503 
0.1.2.0.2.2 Half-Normal sem termos de ajuste + Tamanho do Grupo

# ajustando a função de detecção half-normal para um truncamento de 5% dos dados

coata_distance_hn_size <- coata_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    truncamento = "5%",
    formula = ~size)
Fitting half-normal key function
AIC= 485.86
0.1.2.0.2.3 Hazard-rate sem termos de ajuste e com termos de ajuste Cosseno e Polinomial de Hermite
# ajustando a função de detecção hazard-rate para um truncamento de 5% dos dados

coata_distance_hr <- coata_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hr",
    truncamento = "5%")
Fitting hazard-rate key function
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).AIC= 476.736
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).Starting AIC adjustment term selection.
Fitting hazard-rate key function
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).AIC= 476.736
Fitting hazard-rate key function with cosine(2) adjustments
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).Warning: Model fitting did not converge. Try different initial values or different model
  Model failed to converge.

Hazard-rate key function selected.
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).Starting AIC adjustment term selection.
Fitting hazard-rate key function
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).AIC= 476.736
Fitting hazard-rate key function with simple polynomial(4) adjustments
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).Warning: Model fitting did not converge. Try different initial values or different model
  Model failed to converge.

Hazard-rate key function selected.
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).
coata_distance_hr$`Sem termo`

Distance sampling analysis object

Detection function:
 Hazard-rate key function 

Estimated abundance in covered region: 219.1632 
0.1.2.0.2.4 Hazard-rate sem termos de ajuste e Tamanho do Grupo
# ajustando a função de detecção hazard-rate para um truncamento de 5% dos dados

coata_distance_hr_size <- coata_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hr",
    truncamento = "5%",
    formula = ~size)
Fitting hazard-rate key function
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).AIC= 467.848
Warning: Estimated hazard-rate scale parameter close to 0 (on log scale). Possible problem in data (e.g., spike near zero distance).
0.1.2.0.3 Comparando os modelos
0.1.2.0.3.1 Tabela com o resumo comparativo dos modelos
melhor_modelo_coata <- selecionar_funcao_deteccao_termo_ajuste(
  coata_distance_hn$`Sem termo`,
  coata_distance_hn_size,
  coata_distance_hr$`Sem termo`,
  coata_distance_hr_size
)

melhor_modelo_coata
0.1.2.0.3.2 Gráficos de ajuste das funções de deteção às probabilidades de deteção
modelos_coata <- gerar_lista_modelos_selecionados(
  coata_distance_hr_size,
  coata_distance_hr$`Sem termo`,
  coata_distance_hn$`Sem termo`,
  coata_distance_hn_size,
  nome_modelos_selecionados = melhor_modelo_coata
)

plotar_funcao_deteccao_modelos_selecionados(modelos_coata)

$`Hazard-rate`
NULL

$`Hazard-rate`
NULL

$`Half-normal`
NULL

$`Half-normal`
NULL

0.1.2.0.3.3 Teste de bondade de ajuste dos modelos e Q-Q plots
#criar uma lista com os modelos selecionados, na ordem de seleção
testar_bondade_ajuste(
  modelos_coata,
  plot = TRUE,
  chisq = FALSE,
)

NA

Aqui são gerados Q-Q plots que permitem avaliar a qualidade do ajuste dos modelos. E também uma tabela com os resultados do Carmér-von Mises, onde W é o valor do teste e p seu valor de significância. Nesse caso, quanto maior o valor de p, melhor o ajuste do modelo.

0.1.2.0.4 Avaliando as estimativas de Abundância e Densidade

Aqui, são resumidos os dados de taxa de encontro, abundância e densidade em três tabelas.

0.1.2.0.4.1 Área coberta pela Amostragem
gerar_resultados_Distance(
  dados = modelos_coata,
  resultado_selecao_modelos = melhor_modelo_coata,
  tipo_de_resultado = "area_estudo", 
  estratificacao = TRUE
)
0.1.2.0.4.2 Ábundância

gerar_resultados_Distance(
  dados = modelos_coata,
  resultado_selecao_modelos = melhor_modelo_coata,
  tipo_de_resultado = "abundancia", 
  estratificacao = TRUE
)
NA
0.1.2.0.4.3 Densidade

gerar_resultados_Distance(
  dados = modelos_coata,
  resultado_selecao_modelos = melhor_modelo_coata,
  tipo_de_resultado = "densidade", 
  estratificacao = TRUE
)
NA
0.1.2.0.5 Ajustando modelos para cada estrato espacial (Unidade de Conservação)

A redução no tamanho amostral geralmente faz com que os modelos para os dados globais tenham um ajuste melhor que os modelos ajustados aos estratos. Entretanto, para os dados do Monitora, considerando alguns ruídos amostrais sobre a distribuição dos dados, o excesso de repetições, resultados melhores de ajuste têm sido obtidos para conjutnos de dados menores.

Nas análises anteriores, os parâmetros de ajuste dos modelos e valores de AIC foram gerados somente para os dados globais. Porém, as estimativas relacionadas a área de estudo, abundância e densidade, foram geradas para cada estrato.

Um critério para avaliar se o ajuste das funções para os dados estratificados foi melhor que para os dados globais é a comparação do somatório dos valores de AIC para cada estrato com o valor de AIC do modelo global. Se a soma dos valores de AIC dos estratos for menor que o AIC global, significa que o ajuste foi melhor para os dados estratificados.

Assim, escolhemos um dos modelos testados anteriormente para os dados globais, que foi o Half-normal. Escolhemos o segundo melhor modelo porque consideramos que o ajuste do Hazard-rate, apesar de apresentar os melhores valores de AIC e teste de ajuste de bondade, foi sensível ao pico de observações próximo a zero, substimando as estimativas de probabilidade de detecção. Assim, vamos comparar o AIC global para o modelo do tipo Half-normal com os AICs das funções ajustadas para os dados de cada Unidade de Conservação.

0.1.2.0.5.1 Half-Normal

0.1.2.0.5.1.1 Dados Globais

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_distance_hn <- cutias_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.2.0.5.1.2 Resex Tapajós-Arapiuns

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_tap_distance_hn <- cutias_tap_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.2.0.5.1.3 Resex Tapajós-Arapiuns

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_tap_distance_hn <- cutias_tap_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.2.0.5.1.4 Parna Serra do Pardo

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_par_distance_hn <- cutias_par_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.2.0.5.1.5 Esec da Terra do Meio

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_ter_distance_hn <- cutias_ter_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.2.0.5.1.6 Resex Riozinho do Anfrísio

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_anf_distance_hn <- cutias_anf_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")
0.1.2.0.6 Comparando os modelos
0.1.2.0.6.1 Tabela com o resumo comparativo dos modelos
modelo_cutias_estrat <- comparar_aic_modelo_estratificado(
  cutias_distance_hn,
  cutias_tap_distance_hn,
  cutias_par_distance_hn,
  cutias_ter_distance_hn,
  cutias_anf_distance_hn, 
  nome_modelos = c(
 "Global",
 "Resex Tapajós-Arapiuns",
 "Parna Serra do Prado",
 "Esec da Terra do Meio",
 "Resex do Riozinho do Anfrísio"
  )
)


modelo_cutias_estrat
0.1.2.0.6.2 Gráficos de ajuste das funções de deteção às probabilidades de deteção
modelos_cutias_estrat <- gerar_lista_modelos_selecionados(
  cutias_distance_hn,
  cutias_tap_distance_hn,
  cutias_par_distance_hn,
  cutias_ter_distance_hn,
  cutias_anf_distance_hn,
  nome_modelos_selecionados = modelo_cutias_estrat
)

plotar_funcao_deteccao_modelos_selecionados(modelos_cutias_estrat)

0.1.3 Fluxo 6 - Amostragem por distância estratificada por ano

Para obter as estimativas anuais de densidade continuaremos utilizando a abordagem do Fluxo 2, com amostragens sem repetição.

0.1.3.1 Carregando os dados

Aqui vamos trabalhar com os dados filtrados, sem repetições. O número de observações total foi de 55.

cutias_year <- filtrar_dados(
  nome_ucs = "resex_tapajos_arapiuns", 
  nome_sps = "dasyprocta_croconota",
  validacao_obs = "especie"
)

cutias_year_distance <- transformar_dados_formato_Distance(
  cutias_year,
  amostras_repetidas = FALSE)

cutias_year_distance
0.1.3.1.1 Plotando o histograma das frequências de ocorrência pela distância
0.1.3.1.1.1 Dados Globais

Plotando o histograma para os dados globais.

cutias_year_distance |> 
  tidyr::drop_na(distance) |> 
plotar_distribuicao_distancia_interativo(largura_caixa = 1)
0.1.3.1.1.2 Por Estrato

Plotando o histograma para cada ano.

0.1.3.1.1.2.1 2014

cutia_2014 <- cutias_year_distance |> 
  dplyr::filter(year == 2014)

cutia_2014 |> 
  plotar_distribuicao_distancia_interativo(largura_caixa = 1)

0.1.3.1.1.2.2 **2015*

cutia_2015 <- cutias_year_distance |> 
  dplyr::filter(year == 2015)

cutia_2015 |> 
  plotar_distribuicao_distancia_interativo(largura_caixa = 1)

0.1.3.1.1.2.3 2016

cutia_2016 <- cutias_year_distance |> 
  dplyr::filter(year == 2016)

cutia_2016 |> 
  plotar_distribuicao_distancia_interativo(largura_caixa = 1)

0.1.3.1.1.2.4 2017

cutia_2017 <- cutias_year_distance |> 
  dplyr::filter(year == 2017)

cutia_2017 |> 
  tidyr::drop_na(distance) |> 
  plotar_distribuicao_distancia_interativo(largura_caixa = 1)

0.1.3.1.1.2.5 2018

cutia_2018 <- cutias_year_distance |> 
  dplyr::filter(year == 2018)

cutia_2018 |> 
  tidyr::drop_na(distance) |> 
  plotar_distribuicao_distancia_interativo(largura_caixa = 1)

0.1.3.1.1.2.6 2019

cutia_2019 <- cutias_year_distance |> 
  dplyr::filter(year == 2019)

cutia_2019 |> 
  tidyr::drop_na(distance) |> 
  plotar_distribuicao_distancia_interativo(largura_caixa = 1)

0.1.3.1.1.2.7 2020

cutia_2020 <- cutias_year_distance |> 
  dplyr::filter(year == 2020)

cutia_2020|> 
  tidyr::drop_na(distance) |> 
  plotar_distribuicao_distancia_interativo(largura_caixa = 1)

0.1.3.1.1.2.8 2021

cutia_2021 <- cutias_year_distance |> 
  dplyr::filter(year == 2021)

cutia_2021 |> 
  tidyr::drop_na(distance) |> 
  plotar_distribuicao_distancia_interativo(largura_caixa = 1)
0.1.3.1.2 Ajustando diferentes modelos para dados Globais

Para ajustar os modelos aos dados globais e estratificados, mantivemos a mesma distância de truncamento para os dados das cutias na Resex Tapajós-Arapiuns, de 10%, uma vez que a distrbuição dos dados é semelhante tanto nos dados globais como nas UCs analisadas.

0.1.3.1.2.1 Uniforme com termos de ajuste Cosseno e polinomial simples
# ajustando a função de detecção uniforme para um truncamento de 10% dos dados
cutias_distance_unif_year <- cutias_year_distance |>
  dplyr::filter(year != 2014) |> 
  dplyr::mutate(Region.Label = year) |> 
  ajustar_modelos_Distance(
    funcao_chave = "unif",
    truncamento = "10%")
0.1.3.1.2.2 Half-Normal sem termos de ajuste e com termos de ajuste Cosseno e Polinomial de Hermite
# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_distance_hn_year <- cutias_year_distance |> 
  dplyr::filter(year != 2014) |> 
  dplyr::mutate(Region.Label = year) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    truncamento = "10%")
0.1.3.1.2.3 Hazard-rate sem termos de ajuste e com termos de ajuste Cosseno e Polinomial de Hermite
# ajustando a função de detecção hazard-rate para um truncamento de 10% dos dados
cutias_distance_hr_year <- cutias_year_distance |> 
  dplyr::filter(year != 2014) |> 
  dplyr::mutate(Region.Label = year) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hr",
    truncamento = "10%")
0.1.3.1.3 Comparando os modelos
0.1.3.1.3.1 Tabela com o resumo comparativo dos modelos
melhor_modelo_cutias_year <- selecionar_funcao_deteccao_termo_ajuste(
  cutias_distance_unif_year$Cosseno,
  cutias_distance_unif_year$`Polinomial simples`,
  cutias_distance_hn_year$`Sem termo`,
  cutias_distance_hn_year$Cosseno,
  cutias_distance_hn_year$`Hermite polinomial`,
  cutias_distance_hr_year$`Sem termo`,
  cutias_distance_hr_year$Cosseno,
  cutias_distance_hr_year$`Polinomial simples`
)

melhor_modelo_cutias_year
0.1.3.1.3.2 Gráficos de ajuste das funções de deteção às probabilidades de deteção
modelos_cutias_year <- gerar_lista_modelos_selecionados(
  cutias_distance_hn_year$Cosseno,
  cutias_distance_hr_year$`Sem termo`,
  cutias_distance_unif_year$Cosseno,
  cutias_distance_unif_year$`Polinomial simples`,
  cutias_distance_hn_year$`Sem termo`,
  nome_modelos_selecionados = melhor_modelo_cutias_year
)

plotar_funcao_deteccao_modelos_selecionados(modelos_cutias_year)
0.1.3.1.3.3 Teste de bondade de ajuste dos modelos e Q-Q plots
#criar uma lista com os modelos selecionados, na ordem de seleção
testar_bondade_ajuste(
  modelos_cutias_year,
  plot = TRUE,
  chisq = FALSE,
)
  

Aqui são gerados Q-Q plots que permitem avaliar a qualidade do ajuste dos modelos. E também uma tabela com os resultados do Carmér-von Mises, onde W é o valor do teste e p seu valor de significância. Nesse caso, quanto maior o valor de p, melhor o ajuste do modelo.

0.1.3.1.4 Avaliando as estimativas de Abundância e Densidade

Aqui, são resumidos os dados de taxa de encontro, abundância e densidade em três tabelas.

0.1.3.1.4.1 Área coberta pela Amostragem
gerar_resultados_Distance(
  dados = modelos_cutias_year,
  resultado_selecao_modelos = melhor_modelo_cutias_year,
  tipo_de_resultado = "area_estudo", 
  estratificacao = TRUE
)
0.1.3.1.4.2 Ábundância
resultado_abundancia <- 
gerar_resultados_Distance(
  dados = modelos_cutias_year,
  resultado_selecao_modelos = melhor_modelo_cutias_year,
  tipo_de_resultado = "abundancia", 
  estratificacao = TRUE
)

resultado_abundancia
resultado_abundancia |>
  dplyr::mutate(ano = as.integer(Regiao)) |> 
  dplyr::group_by(ano) |> 
  dplyr::summarise(n = sum(`Abundancia estimada`)) |> 
  ggplot2::ggplot() +
  ggplot2::aes(
    x = ano,
    y = n
  ) + 
  ggplot2::geom_line() +
  ggplot2::theme_minimal()
0.1.3.1.4.3 Densidade
resultados_densidade <- 
gerar_resultados_Distance(
  dados = modelos_cutias_year,
  resultado_selecao_modelos = melhor_modelo_cutias_year,
  tipo_de_resultado = "densidade", 
  estratificacao = TRUE
)

resultados_densidade
resultados_densidade |>
  dplyr::filter(Rotulo != "Total") |> 
  dplyr::mutate(ano = as.integer(Rotulo)) |> 
  ggplot2::ggplot() +
  ggplot2::aes(
    x = ano,
    y = `Estimativa de densidade`
  ) + 
  ggplot2::geom_line() +
  ggplot2::facet_wrap(facets = ggplot2::vars(Modelo)) +
  ggplot2::theme_minimal()
0.1.3.1.5 Ajustando modelos para cada estrato temporal (ano)
0.1.3.1.5.1 Half-Normal

0.1.3.1.5.1.1 Dados Globais

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_distance_year_hn <- cutias_year_distance |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.3.1.5.1.2 2015

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_2015_distance_hn <- cutias_year_distance |> 
  dplyr::filter(year == 2015) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.3.1.5.1.3 2016

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_2016_distance_hn <- cutias_year_distance |> 
  dplyr::filter(year == 2016) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.3.1.5.1.4 2017

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_2017_distance_hn <- cutias_year_distance |> 
  dplyr::filter(year == 2017) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.3.1.5.1.5 2018

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_2018_distance_hn <- cutias_year_distance |> 
  dplyr::filter(year == 2018) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.3.1.5.1.6 2019

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_2019_distance_hn <- cutias_year_distance |> 
  dplyr::filter(year == 2019) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.3.1.5.1.7 2020

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_2020_distance_hn <- cutias_year_distance |> 
  dplyr::filter(year == 2020) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")

0.1.3.1.5.1.8 2021

# ajustando a função de detecção half-normal para um truncamento de 10% dos dados
cutias_2021_distance_hn <- cutias_year_distance |> 
  dplyr::filter(year == 2021) |> 
  ajustar_modelos_Distance(
    funcao_chave = "hn",
    termos_ajuste = "cos",
    truncamento = "10%")
0.1.3.1.6 Comparando os modelos
0.1.3.1.6.1 Tabela com o resumo comparativo dos modelos
modelo_cutias_estrat_year <- comparar_aic_modelo_estratificado(
  cutias_distance_year_hn,
  cutias_2015_distance_hn,
  cutias_2016_distance_hn,
  cutias_2017_distance_hn,
  cutias_2018_distance_hn, 
  cutias_2019_distance_hn, 
  cutias_2020_distance_hn, 
  cutias_2021_distance_hn, 
  nome_modelos = c(
 "Global",
 "2015",
 "2016",
 "2017",
 "2018",
 "2019",
 "2020",
 "2021"
  )
)


modelo_cutias_estrat_year
0.1.3.1.6.2 Gráficos de ajuste das funções de deteção às probabilidades de deteção
modelos_cutias_estrat <- gerar_lista_modelos_selecionados(
  cutias_distance_year_hn,
  cutias_2015_distance_hn,
  cutias_2016_distance_hn,
  cutias_2017_distance_hn,
  cutias_2018_distance_hn,
  cutias_2019_distance_hn,
  cutias_2020_distance_hn,
  cutias_2021_distance_hn,
  nome_modelos_selecionados = modelo_cutias_estrat
)

plotar_funcao_deteccao_modelos_selecionados(modelos_cutias_estrat)
LS0tDQp0aXRsZTogIkVzdGF0aWZpY2FjYW8gY29tIGNvdmFyaWF2ZWwiDQphdXRob3I6ICJMdWNpYW5hIEZ1c2luYXR0byBcbiBWaXRvciBCb3JnZXMtSsO6bmlvciINCmRhdGU6IENyaWFkbyBlbSAzMSBkZSBtYXLDp28gZGUgMjAyMywgYXR1YWxpemFkbyBlbSBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkIGRlICVCDQogIGRlICVZJylgDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDYNCiAgICB0b2NfZmxvYXQ6IG5vDQogICAgbnVtYmVyX3NlY3Rpb246IHllcw0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KZWRpdG9yX29wdGlvbnM6DQogIG1hcmtkb3duOg0KICAgIHdyYXA6IDcyDQotLS0NCg0KIyMgSW5zdGFsYW5kbyBlIGNhcnJlZ2FuZG8gbyBwYWNvdGUgZGlzdGVuY2VNb25pdG9yYWZsb3Jlc3RhbA0KDQpgYGB7cn0NCmRldnRvb2xzOjppbnN0YWxsX2dpdGh1Yigidm50Ym9yZ2VzanIvZGlzdGFuY2VNb25pdG9yYWZsb3Jlc3RhbCIpDQojIA0KbGlicmFyeShkaXN0YW5jZU1vbml0b3JhZmxvcmVzdGFsKQ0KYGBgDQoNCiMjIyBGbHV4byA1IC0gQW1vc3RyYWdlbSBwb3IgZGlzdMOibmNpYSBjb20gZXN0cmF0aWZpY2HDp8OjbyBwb3IgVW5pZGFkZSBkZSBDb25zZXJ2YcOnw6NvDQoNCiMjIyMgRXhwbG9yYW5kbyBvcyBkYWRvcyBkZW50cm8gZGUgY2FkYSBlc3RyYXRvIGVzcGFjaWFsOg0KDQojIyMgQ2FycmVnYXIgRGFkb3MNCg0KYGBge3J9DQojIGZpbHRyYXIgZGFkb3MgZGFzIGN1dGlhcyBwYXJhIGFzIHF1YXRybyBVQ1Mgb25kZSBvY29ycmU6DQpjb2F0YSA8LSBmaWx0cmFyX2RhZG9zKA0KICBub21lX3NwcyA9ICJhdGVsZXNfbWFyZ2luYXR1cyIsDQogIHZhbGlkYWNhb19vYnMgPSAiZXNwZWNpZSINCikNCg0KY29hdGFfZGlzdGFuY2UgPC0gdHJhbnNmb3JtYXJfZGFkb3NfZm9ybWF0b19EaXN0YW5jZSgNCiAgY29hdGEsDQogIGFtb3N0cmFzX3JlcGV0aWRhcyA9IFRSVUUpDQoNCmNvYXRhX2Rpc3RhbmNlDQpgYGANCg0KIyMjIyMgUGxvdGFuZG8gbyBoaXN0b2dyYW1hIGRhcyBmcmVxdcOqbmNpYXMgZGUgb2NvcnLDqm5jaWEgcGVsYSBkaXN0w6JuY2lhDQoNCiMjIyMjIyBEYWRvcyBHbG9iYWlzDQoNClBsb3RhbmRvIG8gaGlzdG9ncmFtYSBwYXJhIG9zIGRhZG9zIGdsb2JhaXMuDQoNCmBgYHtyfQ0KY29hdGFfZGlzdGFuY2UgfD4gDQogIHRpZHlyOjpkcm9wX25hKGRpc3RhbmNlKSB8PiANCnBsb3Rhcl9kaXN0cmlidWljYW9fZGlzdGFuY2lhX2ludGVyYXRpdm8obGFyZ3VyYV9jYWl4YSA9IDEpDQpgYGANCg0KIyMjIyMgQWp1c3RhbmRvIG1vZGVsb3MgY29tIGNvdmFyacOhdmVsIHNpemUNCg0KIyMjIyMjIEhhbGYtTm9ybWFsIHNlbSB0ZXJtb3MgZGUgYWp1c3RlIGUgY29tIHRlcm1vcyBkZSBhanVzdGUgQ29zc2VubyBlIFBvbGlub21pYWwgZGUgSGVybWl0ZQ0KDQpgYGB7cn0NCiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYWxmLW5vcm1hbCBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDUlIGRvcyBkYWRvcw0KDQpjb2F0YV9kaXN0YW5jZV9obiA8LSBjb2F0YV9kaXN0YW5jZSB8PiANCiAgYWp1c3Rhcl9tb2RlbG9zX0Rpc3RhbmNlKA0KICAgIGZ1bmNhb19jaGF2ZSA9ICJobiIsDQogICAgdHJ1bmNhbWVudG8gPSAiNSUiKQ0KDQpjb2F0YV9kaXN0YW5jZV9obiRgU2VtIHRlcm1vYA0KDQpgYGANCg0KIyMjIyMjIEhhbGYtTm9ybWFsIHNlbSB0ZXJtb3MgZGUgYWp1c3RlICsgVGFtYW5obyBkbyBHcnVwbw0KDQpgYGB7cn0NCg0KIyBhanVzdGFuZG8gYSBmdW7Dp8OjbyBkZSBkZXRlY8Onw6NvIGhhbGYtbm9ybWFsIHBhcmEgdW0gdHJ1bmNhbWVudG8gZGUgNSUgZG9zIGRhZG9zDQoNCmNvYXRhX2Rpc3RhbmNlX2huX3NpemUgPC0gY29hdGFfZGlzdGFuY2UgfD4gDQogIGFqdXN0YXJfbW9kZWxvc19EaXN0YW5jZSgNCiAgICBmdW5jYW9fY2hhdmUgPSAiaG4iLA0KICAgIHRydW5jYW1lbnRvID0gIjUlIiwNCiAgICBmb3JtdWxhID0gfnNpemUpDQoNCmBgYA0KDQojIyMjIyMgSGF6YXJkLXJhdGUgc2VtIHRlcm1vcyBkZSBhanVzdGUgZSBjb20gdGVybW9zIGRlIGFqdXN0ZSBDb3NzZW5vIGUgUG9saW5vbWlhbCBkZSBIZXJtaXRlDQoNCmBgYHtyfQ0KIyBhanVzdGFuZG8gYSBmdW7Dp8OjbyBkZSBkZXRlY8Onw6NvIGhhemFyZC1yYXRlIHBhcmEgdW0gdHJ1bmNhbWVudG8gZGUgNSUgZG9zIGRhZG9zDQoNCmNvYXRhX2Rpc3RhbmNlX2hyIDwtIGNvYXRhX2Rpc3RhbmNlIHw+IA0KICBhanVzdGFyX21vZGVsb3NfRGlzdGFuY2UoDQogICAgZnVuY2FvX2NoYXZlID0gImhyIiwNCiAgICB0cnVuY2FtZW50byA9ICI1JSIpDQoNCmNvYXRhX2Rpc3RhbmNlX2hyJGBTZW0gdGVybW9gDQoNCmBgYA0KDQoNCiMjIyMjIyBIYXphcmQtcmF0ZSBzZW0gdGVybW9zIGRlIGFqdXN0ZSBlIFRhbWFuaG8gZG8gR3J1cG8NCg0KYGBge3J9DQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gaGF6YXJkLXJhdGUgcGFyYSB1bSB0cnVuY2FtZW50byBkZSA1JSBkb3MgZGFkb3MNCg0KY29hdGFfZGlzdGFuY2VfaHJfc2l6ZSA8LSBjb2F0YV9kaXN0YW5jZSB8PiANCiAgYWp1c3Rhcl9tb2RlbG9zX0Rpc3RhbmNlKA0KICAgIGZ1bmNhb19jaGF2ZSA9ICJociIsDQogICAgdHJ1bmNhbWVudG8gPSAiNSUiLA0KICAgIGZvcm11bGEgPSB+c2l6ZSkNCg0KYGBgDQoNCg0KDQoNCiMjIyMjIENvbXBhcmFuZG8gb3MgbW9kZWxvcw0KDQojIyMjIyMgVGFiZWxhIGNvbSBvIHJlc3VtbyBjb21wYXJhdGl2byBkb3MgbW9kZWxvcw0KDQpgYGB7cn0NCm1lbGhvcl9tb2RlbG9fY29hdGEgPC0gc2VsZWNpb25hcl9mdW5jYW9fZGV0ZWNjYW9fdGVybW9fYWp1c3RlKA0KICBjb2F0YV9kaXN0YW5jZV9obiRgU2VtIHRlcm1vYCwNCiAgY29hdGFfZGlzdGFuY2VfaG5fc2l6ZSwNCiAgY29hdGFfZGlzdGFuY2VfaHIkYFNlbSB0ZXJtb2AsDQogIGNvYXRhX2Rpc3RhbmNlX2hyX3NpemUNCikNCg0KbWVsaG9yX21vZGVsb19jb2F0YQ0KYGBgDQoNCiMjIyMjIyBHcsOhZmljb3MgZGUgYWp1c3RlIGRhcyBmdW7Dp8O1ZXMgZGUgZGV0ZcOnw6NvIMOgcyBwcm9iYWJpbGlkYWRlcyBkZSBkZXRlw6fDo28NCg0KYGBge3J9DQptb2RlbG9zX2NvYXRhIDwtIGdlcmFyX2xpc3RhX21vZGVsb3Nfc2VsZWNpb25hZG9zKA0KICBjb2F0YV9kaXN0YW5jZV9ocl9zaXplLA0KICBjb2F0YV9kaXN0YW5jZV9ociRgU2VtIHRlcm1vYCwNCiAgY29hdGFfZGlzdGFuY2VfaG4kYFNlbSB0ZXJtb2AsDQogIGNvYXRhX2Rpc3RhbmNlX2huX3NpemUsDQogIG5vbWVfbW9kZWxvc19zZWxlY2lvbmFkb3MgPSBtZWxob3JfbW9kZWxvX2NvYXRhDQopDQoNCnBsb3Rhcl9mdW5jYW9fZGV0ZWNjYW9fbW9kZWxvc19zZWxlY2lvbmFkb3MobW9kZWxvc19jb2F0YSkNCmBgYA0KDQojIyMjIyMgVGVzdGUgZGUgYm9uZGFkZSBkZSBhanVzdGUgZG9zIG1vZGVsb3MgZSBRLVEgcGxvdHMNCg0KYGBge3J9DQojY3JpYXIgdW1hIGxpc3RhIGNvbSBvcyBtb2RlbG9zIHNlbGVjaW9uYWRvcywgbmEgb3JkZW0gZGUgc2VsZcOnw6NvDQp0ZXN0YXJfYm9uZGFkZV9hanVzdGUoDQogIG1vZGVsb3NfY29hdGEsDQogIHBsb3QgPSBUUlVFLA0KICBjaGlzcSA9IEZBTFNFLA0KKQ0KICANCmBgYA0KDQpBcXVpIHPDo28gZ2VyYWRvcyBRLVEgcGxvdHMgcXVlIHBlcm1pdGVtIGF2YWxpYXIgYSBxdWFsaWRhZGUgZG8gYWp1c3RlDQpkb3MgbW9kZWxvcy4gRSB0YW1iw6ltIHVtYSB0YWJlbGEgY29tIG9zIHJlc3VsdGFkb3MgZG8gQ2FybcOpci12b24gTWlzZXMsDQpvbmRlIFcgw6kgbyB2YWxvciBkbyB0ZXN0ZSBlIHAgc2V1IHZhbG9yIGRlIHNpZ25pZmljw6JuY2lhLiBOZXNzZSBjYXNvLA0KcXVhbnRvIG1haW9yIG8gdmFsb3IgZGUgcCwgbWVsaG9yIG8gYWp1c3RlIGRvIG1vZGVsby4NCg0KIyMjIyMgQXZhbGlhbmRvIGFzIGVzdGltYXRpdmFzIGRlIEFidW5kw6JuY2lhIGUgRGVuc2lkYWRlDQoNCkFxdWksIHPDo28gcmVzdW1pZG9zIG9zIGRhZG9zIGRlIHRheGEgZGUgZW5jb250cm8sIGFidW5kw6JuY2lhIGUgZGVuc2lkYWRlDQplbSB0csOqcyB0YWJlbGFzLg0KDQojIyMjIyMgKirDgXJlYSBjb2JlcnRhIHBlbGEgQW1vc3RyYWdlbSoqDQoNCmBgYHtyfQ0KZ2VyYXJfcmVzdWx0YWRvc19EaXN0YW5jZSgNCiAgZGFkb3MgPSBtb2RlbG9zX2NvYXRhLA0KICByZXN1bHRhZG9fc2VsZWNhb19tb2RlbG9zID0gbWVsaG9yX21vZGVsb19jb2F0YSwNCiAgdGlwb19kZV9yZXN1bHRhZG8gPSAiYXJlYV9lc3R1ZG8iLCANCiAgZXN0cmF0aWZpY2FjYW8gPSBUUlVFDQopDQpgYGANCg0KIyMjIyMjICoqw4FidW5kw6JuY2lhKioNCg0KYGBge3J9DQoNCmdlcmFyX3Jlc3VsdGFkb3NfRGlzdGFuY2UoDQogIGRhZG9zID0gbW9kZWxvc19jb2F0YSwNCiAgcmVzdWx0YWRvX3NlbGVjYW9fbW9kZWxvcyA9IG1lbGhvcl9tb2RlbG9fY29hdGEsDQogIHRpcG9fZGVfcmVzdWx0YWRvID0gImFidW5kYW5jaWEiLCANCiAgZXN0cmF0aWZpY2FjYW8gPSBUUlVFDQopDQoNCmBgYA0KDQojIyMjIyMgKipEZW5zaWRhZGUqKg0KDQpgYGB7cn0NCg0KZ2VyYXJfcmVzdWx0YWRvc19EaXN0YW5jZSgNCiAgZGFkb3MgPSBtb2RlbG9zX2NvYXRhLA0KICByZXN1bHRhZG9fc2VsZWNhb19tb2RlbG9zID0gbWVsaG9yX21vZGVsb19jb2F0YSwNCiAgdGlwb19kZV9yZXN1bHRhZG8gPSAiZGVuc2lkYWRlIiwgDQogIGVzdHJhdGlmaWNhY2FvID0gVFJVRQ0KKQ0KDQpgYGANCg0KIyMjIyMgQWp1c3RhbmRvIG1vZGVsb3MgcGFyYSBjYWRhIGVzdHJhdG8gZXNwYWNpYWwgKFVuaWRhZGUgZGUgQ29uc2VydmHDp8OjbykNCg0KQSByZWR1w6fDo28gbm8gdGFtYW5obyBhbW9zdHJhbCBnZXJhbG1lbnRlIGZheiBjb20gcXVlIG9zIG1vZGVsb3MgcGFyYSBvcw0KZGFkb3MgZ2xvYmFpcyB0ZW5oYW0gdW0gYWp1c3RlIG1lbGhvciBxdWUgb3MgbW9kZWxvcyBhanVzdGFkb3MgYW9zDQplc3RyYXRvcy4gRW50cmV0YW50bywgcGFyYSBvcyBkYWRvcyBkbyBNb25pdG9yYSwgY29uc2lkZXJhbmRvIGFsZ3Vucw0KcnXDrWRvcyBhbW9zdHJhaXMgc29icmUgYSBkaXN0cmlidWnDp8OjbyBkb3MgZGFkb3MsIG8gZXhjZXNzbyBkZQ0KcmVwZXRpw6fDtWVzLCByZXN1bHRhZG9zIG1lbGhvcmVzIGRlIGFqdXN0ZSB0w6ptIHNpZG8gb2J0aWRvcyBwYXJhDQpjb25qdXRub3MgZGUgZGFkb3MgbWVub3Jlcy4NCg0KTmFzIGFuw6FsaXNlcyBhbnRlcmlvcmVzLCBvcyBwYXLDom1ldHJvcyBkZSBhanVzdGUgZG9zIG1vZGVsb3MgZSB2YWxvcmVzDQpkZSBBSUMgZm9yYW0gZ2VyYWRvcyBzb21lbnRlIHBhcmEgb3MgZGFkb3MgZ2xvYmFpcy4gUG9yw6ltLCBhcw0KZXN0aW1hdGl2YXMgcmVsYWNpb25hZGFzIGEgw6FyZWEgZGUgZXN0dWRvLCBhYnVuZMOibmNpYSBlIGRlbnNpZGFkZSwgZm9yYW0NCmdlcmFkYXMgcGFyYSBjYWRhIGVzdHJhdG8uDQoNClVtIGNyaXTDqXJpbyBwYXJhIGF2YWxpYXIgc2UgbyBhanVzdGUgZGFzIGZ1bsOnw7VlcyBwYXJhIG9zIGRhZG9zDQplc3RyYXRpZmljYWRvcyBmb2kgbWVsaG9yIHF1ZSBwYXJhIG9zIGRhZG9zIGdsb2JhaXMgw6kgYSBjb21wYXJhw6fDo28gZG8NCnNvbWF0w7NyaW8gZG9zIHZhbG9yZXMgZGUgQUlDIHBhcmEgY2FkYSBlc3RyYXRvIGNvbSBvIHZhbG9yIGRlIEFJQyBkbw0KbW9kZWxvIGdsb2JhbC4gU2UgYSBzb21hIGRvcyB2YWxvcmVzIGRlIEFJQyBkb3MgZXN0cmF0b3MgZm9yIG1lbm9yIHF1ZSBvDQpBSUMgZ2xvYmFsLCBzaWduaWZpY2EgcXVlIG8gYWp1c3RlIGZvaSBtZWxob3IgcGFyYSBvcyBkYWRvcw0KZXN0cmF0aWZpY2Fkb3MuDQoNCkFzc2ltLCBlc2NvbGhlbW9zIHVtIGRvcyBtb2RlbG9zIHRlc3RhZG9zIGFudGVyaW9ybWVudGUgcGFyYSBvcyBkYWRvcw0KZ2xvYmFpcywgcXVlIGZvaSBvIEhhbGYtbm9ybWFsLiBFc2NvbGhlbW9zIG8gc2VndW5kbyBtZWxob3IgbW9kZWxvDQpwb3JxdWUgY29uc2lkZXJhbW9zIHF1ZSBvIGFqdXN0ZSBkbyBIYXphcmQtcmF0ZSwgYXBlc2FyIGRlIGFwcmVzZW50YXIgb3MNCm1lbGhvcmVzIHZhbG9yZXMgZGUgQUlDIGUgdGVzdGUgZGUgYWp1c3RlIGRlIGJvbmRhZGUsIGZvaSBzZW5zw612ZWwgYW8NCnBpY28gZGUgb2JzZXJ2YcOnw7VlcyBwcsOzeGltbyBhIHplcm8sIHN1YnN0aW1hbmRvIGFzIGVzdGltYXRpdmFzIGRlDQpwcm9iYWJpbGlkYWRlIGRlIGRldGVjw6fDo28uIEFzc2ltLCB2YW1vcyBjb21wYXJhciBvIEFJQyBnbG9iYWwgcGFyYSBvDQptb2RlbG8gZG8gdGlwbyBIYWxmLW5vcm1hbCBjb20gb3MgQUlDcyBkYXMgZnVuw6fDtWVzIGFqdXN0YWRhcyBwYXJhIG9zDQpkYWRvcyBkZSBjYWRhIFVuaWRhZGUgZGUgQ29uc2VydmHDp8Ojby4NCg0KIyMjIyMjIEhhbGYtTm9ybWFsDQoNCiMjIyMjIyMgKipEYWRvcyBHbG9iYWlzKioNCg0KYGBge3J9DQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gaGFsZi1ub3JtYWwgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAxMCUgZG9zIGRhZG9zDQpjdXRpYXNfZGlzdGFuY2VfaG4gPC0gY3V0aWFzX2Rpc3RhbmNlIHw+IA0KICBhanVzdGFyX21vZGVsb3NfRGlzdGFuY2UoDQogICAgZnVuY2FvX2NoYXZlID0gImhuIiwNCiAgICB0ZXJtb3NfYWp1c3RlID0gImNvcyIsDQogICAgdHJ1bmNhbWVudG8gPSAiMTAlIikNCmBgYA0KDQojIyMjIyMjICoqUmVzZXggVGFwYWrDs3MtQXJhcGl1bnMqKg0KDQpgYGB7cn0NCiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYWxmLW5vcm1hbCBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDEwJSBkb3MgZGFkb3MNCmN1dGlhc190YXBfZGlzdGFuY2VfaG4gPC0gY3V0aWFzX3RhcF9kaXN0YW5jZSB8PiANCiAgYWp1c3Rhcl9tb2RlbG9zX0Rpc3RhbmNlKA0KICAgIGZ1bmNhb19jaGF2ZSA9ICJobiIsDQogICAgdGVybW9zX2FqdXN0ZSA9ICJjb3MiLA0KICAgIHRydW5jYW1lbnRvID0gIjEwJSIpDQpgYGANCg0KIyMjIyMjIyAqKlJlc2V4IFRhcGFqw7NzLUFyYXBpdW5zKioNCg0KYGBge3J9DQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gaGFsZi1ub3JtYWwgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAxMCUgZG9zIGRhZG9zDQpjdXRpYXNfdGFwX2Rpc3RhbmNlX2huIDwtIGN1dGlhc190YXBfZGlzdGFuY2UgfD4gDQogIGFqdXN0YXJfbW9kZWxvc19EaXN0YW5jZSgNCiAgICBmdW5jYW9fY2hhdmUgPSAiaG4iLA0KICAgIHRlcm1vc19hanVzdGUgPSAiY29zIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KYGBgDQoNCiMjIyMjIyMgKipQYXJuYSBTZXJyYSBkbyBQYXJkbyoqDQoNCmBgYHtyfQ0KIyBhanVzdGFuZG8gYSBmdW7Dp8OjbyBkZSBkZXRlY8Onw6NvIGhhbGYtbm9ybWFsIHBhcmEgdW0gdHJ1bmNhbWVudG8gZGUgMTAlIGRvcyBkYWRvcw0KY3V0aWFzX3Bhcl9kaXN0YW5jZV9obiA8LSBjdXRpYXNfcGFyX2Rpc3RhbmNlIHw+IA0KICBhanVzdGFyX21vZGVsb3NfRGlzdGFuY2UoDQogICAgZnVuY2FvX2NoYXZlID0gImhuIiwNCiAgICB0ZXJtb3NfYWp1c3RlID0gImNvcyIsDQogICAgdHJ1bmNhbWVudG8gPSAiMTAlIikNCmBgYA0KDQojIyMjIyMjICoqRXNlYyBkYSBUZXJyYSBkbyBNZWlvKioNCg0KYGBge3J9DQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gaGFsZi1ub3JtYWwgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAxMCUgZG9zIGRhZG9zDQpjdXRpYXNfdGVyX2Rpc3RhbmNlX2huIDwtIGN1dGlhc190ZXJfZGlzdGFuY2UgfD4gDQogIGFqdXN0YXJfbW9kZWxvc19EaXN0YW5jZSgNCiAgICBmdW5jYW9fY2hhdmUgPSAiaG4iLA0KICAgIHRlcm1vc19hanVzdGUgPSAiY29zIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KYGBgDQoNCiMjIyMjIyMgKipSZXNleCBSaW96aW5obyBkbyBBbmZyw61zaW8qKg0KDQpgYGB7cn0NCiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYWxmLW5vcm1hbCBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDEwJSBkb3MgZGFkb3MNCmN1dGlhc19hbmZfZGlzdGFuY2VfaG4gPC0gY3V0aWFzX2FuZl9kaXN0YW5jZSB8PiANCiAgYWp1c3Rhcl9tb2RlbG9zX0Rpc3RhbmNlKA0KICAgIGZ1bmNhb19jaGF2ZSA9ICJobiIsDQogICAgdGVybW9zX2FqdXN0ZSA9ICJjb3MiLA0KICAgIHRydW5jYW1lbnRvID0gIjEwJSIpDQpgYGANCg0KIyMjIyMgQ29tcGFyYW5kbyBvcyBtb2RlbG9zDQoNCiMjIyMjIyBUYWJlbGEgY29tIG8gcmVzdW1vIGNvbXBhcmF0aXZvIGRvcyBtb2RlbG9zDQoNCmBgYHtyfQ0KbW9kZWxvX2N1dGlhc19lc3RyYXQgPC0gY29tcGFyYXJfYWljX21vZGVsb19lc3RyYXRpZmljYWRvKA0KICBjdXRpYXNfZGlzdGFuY2VfaG4sDQogIGN1dGlhc190YXBfZGlzdGFuY2VfaG4sDQogIGN1dGlhc19wYXJfZGlzdGFuY2VfaG4sDQogIGN1dGlhc190ZXJfZGlzdGFuY2VfaG4sDQogIGN1dGlhc19hbmZfZGlzdGFuY2VfaG4sIA0KICBub21lX21vZGVsb3MgPSBjKA0KICJHbG9iYWwiLA0KICJSZXNleCBUYXBhasOzcy1BcmFwaXVucyIsDQogIlBhcm5hIFNlcnJhIGRvIFByYWRvIiwNCiAiRXNlYyBkYSBUZXJyYSBkbyBNZWlvIiwNCiAiUmVzZXggZG8gUmlvemluaG8gZG8gQW5mcsOtc2lvIg0KICApDQopDQoNCg0KbW9kZWxvX2N1dGlhc19lc3RyYXQNCmBgYA0KDQojIyMjIyMgR3LDoWZpY29zIGRlIGFqdXN0ZSBkYXMgZnVuw6fDtWVzIGRlIGRldGXDp8OjbyDDoHMgcHJvYmFiaWxpZGFkZXMgZGUgZGV0ZcOnw6NvDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KbW9kZWxvc19jdXRpYXNfZXN0cmF0IDwtIGdlcmFyX2xpc3RhX21vZGVsb3Nfc2VsZWNpb25hZG9zKA0KICBjdXRpYXNfZGlzdGFuY2VfaG4sDQogIGN1dGlhc190YXBfZGlzdGFuY2VfaG4sDQogIGN1dGlhc19wYXJfZGlzdGFuY2VfaG4sDQogIGN1dGlhc190ZXJfZGlzdGFuY2VfaG4sDQogIGN1dGlhc19hbmZfZGlzdGFuY2VfaG4sDQogIG5vbWVfbW9kZWxvc19zZWxlY2lvbmFkb3MgPSBtb2RlbG9fY3V0aWFzX2VzdHJhdA0KKQ0KDQpwbG90YXJfZnVuY2FvX2RldGVjY2FvX21vZGVsb3Nfc2VsZWNpb25hZG9zKG1vZGVsb3NfY3V0aWFzX2VzdHJhdCkNCmBgYA0KDQojIyMgRmx1eG8gNiAtIEFtb3N0cmFnZW0gcG9yIGRpc3TDom5jaWEgZXN0cmF0aWZpY2FkYSBwb3IgYW5vDQoNClBhcmEgb2J0ZXIgYXMgZXN0aW1hdGl2YXMgYW51YWlzIGRlIGRlbnNpZGFkZSBjb250aW51YXJlbW9zIHV0aWxpemFuZG8gYQ0KYWJvcmRhZ2VtIGRvIEZsdXhvIDIsIGNvbSBhbW9zdHJhZ2VucyBzZW0gcmVwZXRpw6fDo28uDQoNCiMjIyMgQ2FycmVnYW5kbyBvcyBkYWRvcw0KDQpBcXVpIHZhbW9zIHRyYWJhbGhhciBjb20gb3MgZGFkb3MgZmlsdHJhZG9zLCBzZW0gcmVwZXRpw6fDtWVzLiBPIG7Dum1lcm8gZGUNCm9ic2VydmHDp8O1ZXMgdG90YWwgZm9pIGRlIDU1Lg0KDQpgYGB7cn0NCmN1dGlhc195ZWFyIDwtIGZpbHRyYXJfZGFkb3MoDQogIG5vbWVfdWNzID0gInJlc2V4X3RhcGFqb3NfYXJhcGl1bnMiLCANCiAgbm9tZV9zcHMgPSAiZGFzeXByb2N0YV9jcm9jb25vdGEiLA0KICB2YWxpZGFjYW9fb2JzID0gImVzcGVjaWUiDQopDQoNCmN1dGlhc195ZWFyX2Rpc3RhbmNlIDwtIHRyYW5zZm9ybWFyX2RhZG9zX2Zvcm1hdG9fRGlzdGFuY2UoDQogIGN1dGlhc195ZWFyLA0KICBhbW9zdHJhc19yZXBldGlkYXMgPSBGQUxTRSkNCg0KY3V0aWFzX3llYXJfZGlzdGFuY2UNCmBgYA0KDQojIyMjIyBQbG90YW5kbyBvIGhpc3RvZ3JhbWEgZGFzIGZyZXF1w6puY2lhcyBkZSBvY29ycsOqbmNpYSBwZWxhIGRpc3TDom5jaWENCg0KIyMjIyMjIERhZG9zIEdsb2JhaXMNCg0KUGxvdGFuZG8gbyBoaXN0b2dyYW1hIHBhcmEgb3MgZGFkb3MgZ2xvYmFpcy4NCg0KYGBge3J9DQpjdXRpYXNfeWVhcl9kaXN0YW5jZSB8PiANCiAgdGlkeXI6OmRyb3BfbmEoZGlzdGFuY2UpIHw+IA0KcGxvdGFyX2Rpc3RyaWJ1aWNhb19kaXN0YW5jaWFfaW50ZXJhdGl2byhsYXJndXJhX2NhaXhhID0gMSkNCmBgYA0KDQojIyMjIyMgUG9yIEVzdHJhdG8NCg0KUGxvdGFuZG8gbyBoaXN0b2dyYW1hIHBhcmEgY2FkYSBhbm8uDQoNCiMjIyMjIyMgKioyMDE0KioNCg0KYGBge3J9DQpjdXRpYV8yMDE0IDwtIGN1dGlhc195ZWFyX2Rpc3RhbmNlIHw+IA0KICBkcGx5cjo6ZmlsdGVyKHllYXIgPT0gMjAxNCkNCg0KY3V0aWFfMjAxNCB8PiANCiAgcGxvdGFyX2Rpc3RyaWJ1aWNhb19kaXN0YW5jaWFfaW50ZXJhdGl2byhsYXJndXJhX2NhaXhhID0gMSkNCmBgYA0KDQojIyMjIyMjIFwqXCoyMDE1XCoNCg0KYGBge3J9DQpjdXRpYV8yMDE1IDwtIGN1dGlhc195ZWFyX2Rpc3RhbmNlIHw+IA0KICBkcGx5cjo6ZmlsdGVyKHllYXIgPT0gMjAxNSkNCg0KY3V0aWFfMjAxNSB8PiANCiAgcGxvdGFyX2Rpc3RyaWJ1aWNhb19kaXN0YW5jaWFfaW50ZXJhdGl2byhsYXJndXJhX2NhaXhhID0gMSkNCmBgYA0KDQojIyMjIyMjICoqMjAxNioqDQoNCmBgYHtyfQ0KY3V0aWFfMjAxNiA8LSBjdXRpYXNfeWVhcl9kaXN0YW5jZSB8PiANCiAgZHBseXI6OmZpbHRlcih5ZWFyID09IDIwMTYpDQoNCmN1dGlhXzIwMTYgfD4gDQogIHBsb3Rhcl9kaXN0cmlidWljYW9fZGlzdGFuY2lhX2ludGVyYXRpdm8obGFyZ3VyYV9jYWl4YSA9IDEpDQpgYGANCg0KIyMjIyMjIyAqKjIwMTcqKg0KDQpgYGB7cn0NCmN1dGlhXzIwMTcgPC0gY3V0aWFzX3llYXJfZGlzdGFuY2UgfD4gDQogIGRwbHlyOjpmaWx0ZXIoeWVhciA9PSAyMDE3KQ0KDQpjdXRpYV8yMDE3IHw+IA0KICB0aWR5cjo6ZHJvcF9uYShkaXN0YW5jZSkgfD4gDQogIHBsb3Rhcl9kaXN0cmlidWljYW9fZGlzdGFuY2lhX2ludGVyYXRpdm8obGFyZ3VyYV9jYWl4YSA9IDEpDQpgYGANCg0KIyMjIyMjIyAqKjIwMTgqKg0KDQpgYGB7cn0NCmN1dGlhXzIwMTggPC0gY3V0aWFzX3llYXJfZGlzdGFuY2UgfD4gDQogIGRwbHlyOjpmaWx0ZXIoeWVhciA9PSAyMDE4KQ0KDQpjdXRpYV8yMDE4IHw+IA0KICB0aWR5cjo6ZHJvcF9uYShkaXN0YW5jZSkgfD4gDQogIHBsb3Rhcl9kaXN0cmlidWljYW9fZGlzdGFuY2lhX2ludGVyYXRpdm8obGFyZ3VyYV9jYWl4YSA9IDEpDQpgYGANCg0KIyMjIyMjIyAqKjIwMTkqKg0KDQpgYGB7cn0NCmN1dGlhXzIwMTkgPC0gY3V0aWFzX3llYXJfZGlzdGFuY2UgfD4gDQogIGRwbHlyOjpmaWx0ZXIoeWVhciA9PSAyMDE5KQ0KDQpjdXRpYV8yMDE5IHw+IA0KICB0aWR5cjo6ZHJvcF9uYShkaXN0YW5jZSkgfD4gDQogIHBsb3Rhcl9kaXN0cmlidWljYW9fZGlzdGFuY2lhX2ludGVyYXRpdm8obGFyZ3VyYV9jYWl4YSA9IDEpDQpgYGANCg0KIyMjIyMjIyAqKjIwMjAqKg0KDQpgYGB7cn0NCmN1dGlhXzIwMjAgPC0gY3V0aWFzX3llYXJfZGlzdGFuY2UgfD4gDQogIGRwbHlyOjpmaWx0ZXIoeWVhciA9PSAyMDIwKQ0KDQpjdXRpYV8yMDIwfD4gDQogIHRpZHlyOjpkcm9wX25hKGRpc3RhbmNlKSB8PiANCiAgcGxvdGFyX2Rpc3RyaWJ1aWNhb19kaXN0YW5jaWFfaW50ZXJhdGl2byhsYXJndXJhX2NhaXhhID0gMSkNCmBgYA0KDQojIyMjIyMjICoqMjAyMSoqDQoNCmBgYHtyfQ0KY3V0aWFfMjAyMSA8LSBjdXRpYXNfeWVhcl9kaXN0YW5jZSB8PiANCiAgZHBseXI6OmZpbHRlcih5ZWFyID09IDIwMjEpDQoNCmN1dGlhXzIwMjEgfD4gDQogIHRpZHlyOjpkcm9wX25hKGRpc3RhbmNlKSB8PiANCiAgcGxvdGFyX2Rpc3RyaWJ1aWNhb19kaXN0YW5jaWFfaW50ZXJhdGl2byhsYXJndXJhX2NhaXhhID0gMSkNCmBgYA0KDQojIyMjIyBBanVzdGFuZG8gZGlmZXJlbnRlcyBtb2RlbG9zIHBhcmEgZGFkb3MgR2xvYmFpcw0KDQoqKlBhcmEgYWp1c3RhciBvcyBtb2RlbG9zIGFvcyBkYWRvcyBnbG9iYWlzIGUgZXN0cmF0aWZpY2Fkb3MsIG1hbnRpdmVtb3MNCmEgbWVzbWEgZGlzdMOibmNpYSBkZSB0cnVuY2FtZW50byBwYXJhIG9zIGRhZG9zIGRhcyBjdXRpYXMgbmEgUmVzZXgNClRhcGFqw7NzLUFyYXBpdW5zLCBkZSAxMCUsIHVtYSB2ZXogcXVlIGEgZGlzdHJidWnDp8OjbyBkb3MgZGFkb3Mgw6kNCnNlbWVsaGFudGUgdGFudG8gbm9zIGRhZG9zIGdsb2JhaXMgY29tbyBuYXMgVUNzIGFuYWxpc2FkYXMuKioNCg0KIyMjIyMjIFVuaWZvcm1lIGNvbSB0ZXJtb3MgZGUgYWp1c3RlIENvc3Nlbm8gZSBwb2xpbm9taWFsIHNpbXBsZXMNCg0KYGBge3J9DQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gdW5pZm9ybWUgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAxMCUgZG9zIGRhZG9zDQpjdXRpYXNfZGlzdGFuY2VfdW5pZl95ZWFyIDwtIGN1dGlhc195ZWFyX2Rpc3RhbmNlIHw+DQogIGRwbHlyOjpmaWx0ZXIoeWVhciAhPSAyMDE0KSB8PiANCiAgZHBseXI6Om11dGF0ZShSZWdpb24uTGFiZWwgPSB5ZWFyKSB8PiANCiAgYWp1c3Rhcl9tb2RlbG9zX0Rpc3RhbmNlKA0KICAgIGZ1bmNhb19jaGF2ZSA9ICJ1bmlmIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KYGBgDQoNCiMjIyMjIyBIYWxmLU5vcm1hbCBzZW0gdGVybW9zIGRlIGFqdXN0ZSBlIGNvbSB0ZXJtb3MgZGUgYWp1c3RlIENvc3Nlbm8gZSBQb2xpbm9taWFsIGRlIEhlcm1pdGUNCg0KYGBge3J9DQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gaGFsZi1ub3JtYWwgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAxMCUgZG9zIGRhZG9zDQpjdXRpYXNfZGlzdGFuY2VfaG5feWVhciA8LSBjdXRpYXNfeWVhcl9kaXN0YW5jZSB8PiANCiAgZHBseXI6OmZpbHRlcih5ZWFyICE9IDIwMTQpIHw+IA0KICBkcGx5cjo6bXV0YXRlKFJlZ2lvbi5MYWJlbCA9IHllYXIpIHw+IA0KICBhanVzdGFyX21vZGVsb3NfRGlzdGFuY2UoDQogICAgZnVuY2FvX2NoYXZlID0gImhuIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KYGBgDQoNCiMjIyMjIyBIYXphcmQtcmF0ZSBzZW0gdGVybW9zIGRlIGFqdXN0ZSBlIGNvbSB0ZXJtb3MgZGUgYWp1c3RlIENvc3Nlbm8gZSBQb2xpbm9taWFsIGRlIEhlcm1pdGUNCg0KYGBge3J9DQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gaGF6YXJkLXJhdGUgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAxMCUgZG9zIGRhZG9zDQpjdXRpYXNfZGlzdGFuY2VfaHJfeWVhciA8LSBjdXRpYXNfeWVhcl9kaXN0YW5jZSB8PiANCiAgZHBseXI6OmZpbHRlcih5ZWFyICE9IDIwMTQpIHw+IA0KICBkcGx5cjo6bXV0YXRlKFJlZ2lvbi5MYWJlbCA9IHllYXIpIHw+IA0KICBhanVzdGFyX21vZGVsb3NfRGlzdGFuY2UoDQogICAgZnVuY2FvX2NoYXZlID0gImhyIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KYGBgDQoNCiMjIyMjIENvbXBhcmFuZG8gb3MgbW9kZWxvcw0KDQojIyMjIyMgVGFiZWxhIGNvbSBvIHJlc3VtbyBjb21wYXJhdGl2byBkb3MgbW9kZWxvcw0KDQpgYGB7cn0NCm1lbGhvcl9tb2RlbG9fY3V0aWFzX3llYXIgPC0gc2VsZWNpb25hcl9mdW5jYW9fZGV0ZWNjYW9fdGVybW9fYWp1c3RlKA0KICBjdXRpYXNfZGlzdGFuY2VfdW5pZl95ZWFyJENvc3Nlbm8sDQogIGN1dGlhc19kaXN0YW5jZV91bmlmX3llYXIkYFBvbGlub21pYWwgc2ltcGxlc2AsDQogIGN1dGlhc19kaXN0YW5jZV9obl95ZWFyJGBTZW0gdGVybW9gLA0KICBjdXRpYXNfZGlzdGFuY2VfaG5feWVhciRDb3NzZW5vLA0KICBjdXRpYXNfZGlzdGFuY2VfaG5feWVhciRgSGVybWl0ZSBwb2xpbm9taWFsYCwNCiAgY3V0aWFzX2Rpc3RhbmNlX2hyX3llYXIkYFNlbSB0ZXJtb2AsDQogIGN1dGlhc19kaXN0YW5jZV9ocl95ZWFyJENvc3Nlbm8sDQogIGN1dGlhc19kaXN0YW5jZV9ocl95ZWFyJGBQb2xpbm9taWFsIHNpbXBsZXNgDQopDQoNCm1lbGhvcl9tb2RlbG9fY3V0aWFzX3llYXINCmBgYA0KDQojIyMjIyMgR3LDoWZpY29zIGRlIGFqdXN0ZSBkYXMgZnVuw6fDtWVzIGRlIGRldGXDp8OjbyDDoHMgcHJvYmFiaWxpZGFkZXMgZGUgZGV0ZcOnw6NvDQoNCmBgYHtyfQ0KbW9kZWxvc19jdXRpYXNfeWVhciA8LSBnZXJhcl9saXN0YV9tb2RlbG9zX3NlbGVjaW9uYWRvcygNCiAgY3V0aWFzX2Rpc3RhbmNlX2huX3llYXIkQ29zc2VubywNCiAgY3V0aWFzX2Rpc3RhbmNlX2hyX3llYXIkYFNlbSB0ZXJtb2AsDQogIGN1dGlhc19kaXN0YW5jZV91bmlmX3llYXIkQ29zc2VubywNCiAgY3V0aWFzX2Rpc3RhbmNlX3VuaWZfeWVhciRgUG9saW5vbWlhbCBzaW1wbGVzYCwNCiAgY3V0aWFzX2Rpc3RhbmNlX2huX3llYXIkYFNlbSB0ZXJtb2AsDQogIG5vbWVfbW9kZWxvc19zZWxlY2lvbmFkb3MgPSBtZWxob3JfbW9kZWxvX2N1dGlhc195ZWFyDQopDQoNCnBsb3Rhcl9mdW5jYW9fZGV0ZWNjYW9fbW9kZWxvc19zZWxlY2lvbmFkb3MobW9kZWxvc19jdXRpYXNfeWVhcikNCmBgYA0KDQojIyMjIyMgVGVzdGUgZGUgYm9uZGFkZSBkZSBhanVzdGUgZG9zIG1vZGVsb3MgZSBRLVEgcGxvdHMNCg0KYGBge3J9DQojY3JpYXIgdW1hIGxpc3RhIGNvbSBvcyBtb2RlbG9zIHNlbGVjaW9uYWRvcywgbmEgb3JkZW0gZGUgc2VsZcOnw6NvDQp0ZXN0YXJfYm9uZGFkZV9hanVzdGUoDQogIG1vZGVsb3NfY3V0aWFzX3llYXIsDQogIHBsb3QgPSBUUlVFLA0KICBjaGlzcSA9IEZBTFNFLA0KKQ0KICANCmBgYA0KDQpBcXVpIHPDo28gZ2VyYWRvcyBRLVEgcGxvdHMgcXVlIHBlcm1pdGVtIGF2YWxpYXIgYSBxdWFsaWRhZGUgZG8gYWp1c3RlDQpkb3MgbW9kZWxvcy4gRSB0YW1iw6ltIHVtYSB0YWJlbGEgY29tIG9zIHJlc3VsdGFkb3MgZG8gQ2FybcOpci12b24gTWlzZXMsDQpvbmRlIFcgw6kgbyB2YWxvciBkbyB0ZXN0ZSBlIHAgc2V1IHZhbG9yIGRlIHNpZ25pZmljw6JuY2lhLiBOZXNzZSBjYXNvLA0KcXVhbnRvIG1haW9yIG8gdmFsb3IgZGUgcCwgbWVsaG9yIG8gYWp1c3RlIGRvIG1vZGVsby4NCg0KIyMjIyMgQXZhbGlhbmRvIGFzIGVzdGltYXRpdmFzIGRlIEFidW5kw6JuY2lhIGUgRGVuc2lkYWRlDQoNCkFxdWksIHPDo28gcmVzdW1pZG9zIG9zIGRhZG9zIGRlIHRheGEgZGUgZW5jb250cm8sIGFidW5kw6JuY2lhIGUgZGVuc2lkYWRlDQplbSB0csOqcyB0YWJlbGFzLg0KDQojIyMjIyMgKirDgXJlYSBjb2JlcnRhIHBlbGEgQW1vc3RyYWdlbSoqDQoNCmBgYHtyfQ0KZ2VyYXJfcmVzdWx0YWRvc19EaXN0YW5jZSgNCiAgZGFkb3MgPSBtb2RlbG9zX2N1dGlhc195ZWFyLA0KICByZXN1bHRhZG9fc2VsZWNhb19tb2RlbG9zID0gbWVsaG9yX21vZGVsb19jdXRpYXNfeWVhciwNCiAgdGlwb19kZV9yZXN1bHRhZG8gPSAiYXJlYV9lc3R1ZG8iLCANCiAgZXN0cmF0aWZpY2FjYW8gPSBUUlVFDQopDQpgYGANCg0KIyMjIyMjICoqw4FidW5kw6JuY2lhKioNCg0KYGBge3J9DQpyZXN1bHRhZG9fYWJ1bmRhbmNpYSA8LSANCmdlcmFyX3Jlc3VsdGFkb3NfRGlzdGFuY2UoDQogIGRhZG9zID0gbW9kZWxvc19jdXRpYXNfeWVhciwNCiAgcmVzdWx0YWRvX3NlbGVjYW9fbW9kZWxvcyA9IG1lbGhvcl9tb2RlbG9fY3V0aWFzX3llYXIsDQogIHRpcG9fZGVfcmVzdWx0YWRvID0gImFidW5kYW5jaWEiLCANCiAgZXN0cmF0aWZpY2FjYW8gPSBUUlVFDQopDQoNCnJlc3VsdGFkb19hYnVuZGFuY2lhDQpgYGANCg0KYGBge3J9DQpyZXN1bHRhZG9fYWJ1bmRhbmNpYSB8Pg0KICBkcGx5cjo6bXV0YXRlKGFubyA9IGFzLmludGVnZXIoUmVnaWFvKSkgfD4gDQogIGRwbHlyOjpncm91cF9ieShhbm8pIHw+IA0KICBkcGx5cjo6c3VtbWFyaXNlKG4gPSBzdW0oYEFidW5kYW5jaWEgZXN0aW1hZGFgKSkgfD4gDQogIGdncGxvdDI6OmdncGxvdCgpICsNCiAgZ2dwbG90Mjo6YWVzKA0KICAgIHggPSBhbm8sDQogICAgeSA9IG4NCiAgKSArIA0KICBnZ3Bsb3QyOjpnZW9tX2xpbmUoKSArDQogIGdncGxvdDI6OnRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyMjIyAqKkRlbnNpZGFkZSoqDQoNCmBgYHtyfQ0KcmVzdWx0YWRvc19kZW5zaWRhZGUgPC0gDQpnZXJhcl9yZXN1bHRhZG9zX0Rpc3RhbmNlKA0KICBkYWRvcyA9IG1vZGVsb3NfY3V0aWFzX3llYXIsDQogIHJlc3VsdGFkb19zZWxlY2FvX21vZGVsb3MgPSBtZWxob3JfbW9kZWxvX2N1dGlhc195ZWFyLA0KICB0aXBvX2RlX3Jlc3VsdGFkbyA9ICJkZW5zaWRhZGUiLCANCiAgZXN0cmF0aWZpY2FjYW8gPSBUUlVFDQopDQoNCnJlc3VsdGFkb3NfZGVuc2lkYWRlDQpgYGANCg0KYGBge3J9DQpyZXN1bHRhZG9zX2RlbnNpZGFkZSB8Pg0KICBkcGx5cjo6ZmlsdGVyKFJvdHVsbyAhPSAiVG90YWwiKSB8PiANCiAgZHBseXI6Om11dGF0ZShhbm8gPSBhcy5pbnRlZ2VyKFJvdHVsbykpIHw+IA0KICBnZ3Bsb3QyOjpnZ3Bsb3QoKSArDQogIGdncGxvdDI6OmFlcygNCiAgICB4ID0gYW5vLA0KICAgIHkgPSBgRXN0aW1hdGl2YSBkZSBkZW5zaWRhZGVgDQogICkgKyANCiAgZ2dwbG90Mjo6Z2VvbV9saW5lKCkgKw0KICBnZ3Bsb3QyOjpmYWNldF93cmFwKGZhY2V0cyA9IGdncGxvdDI6OnZhcnMoTW9kZWxvKSkgKw0KICBnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyMjIyBBanVzdGFuZG8gbW9kZWxvcyBwYXJhIGNhZGEgZXN0cmF0byB0ZW1wb3JhbCAoYW5vKQ0KDQojIyMjIyMgSGFsZi1Ob3JtYWwNCg0KIyMjIyMjIyAqKkRhZG9zIEdsb2JhaXMqKg0KDQpgYGB7cn0NCiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYWxmLW5vcm1hbCBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDEwJSBkb3MgZGFkb3MNCmN1dGlhc19kaXN0YW5jZV95ZWFyX2huIDwtIGN1dGlhc195ZWFyX2Rpc3RhbmNlIHw+IA0KICBhanVzdGFyX21vZGVsb3NfRGlzdGFuY2UoDQogICAgZnVuY2FvX2NoYXZlID0gImhuIiwNCiAgICB0ZXJtb3NfYWp1c3RlID0gImNvcyIsDQogICAgdHJ1bmNhbWVudG8gPSAiMTAlIikNCmBgYA0KDQojIyMjIyMjICoqMjAxNSoqDQoNCmBgYHtyfQ0KIyBhanVzdGFuZG8gYSBmdW7Dp8OjbyBkZSBkZXRlY8Onw6NvIGhhbGYtbm9ybWFsIHBhcmEgdW0gdHJ1bmNhbWVudG8gZGUgMTAlIGRvcyBkYWRvcw0KY3V0aWFzXzIwMTVfZGlzdGFuY2VfaG4gPC0gY3V0aWFzX3llYXJfZGlzdGFuY2UgfD4gDQogIGRwbHlyOjpmaWx0ZXIoeWVhciA9PSAyMDE1KSB8PiANCiAgYWp1c3Rhcl9tb2RlbG9zX0Rpc3RhbmNlKA0KICAgIGZ1bmNhb19jaGF2ZSA9ICJobiIsDQogICAgdGVybW9zX2FqdXN0ZSA9ICJjb3MiLA0KICAgIHRydW5jYW1lbnRvID0gIjEwJSIpDQpgYGANCg0KIyMjIyMjIyAqKjIwMTYqKg0KDQpgYGB7cn0NCiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYWxmLW5vcm1hbCBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDEwJSBkb3MgZGFkb3MNCmN1dGlhc18yMDE2X2Rpc3RhbmNlX2huIDwtIGN1dGlhc195ZWFyX2Rpc3RhbmNlIHw+IA0KICBkcGx5cjo6ZmlsdGVyKHllYXIgPT0gMjAxNikgfD4gDQogIGFqdXN0YXJfbW9kZWxvc19EaXN0YW5jZSgNCiAgICBmdW5jYW9fY2hhdmUgPSAiaG4iLA0KICAgIHRlcm1vc19hanVzdGUgPSAiY29zIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KYGBgDQoNCiMjIyMjIyMgKioyMDE3KioNCg0KYGBge3J9DQojIGFqdXN0YW5kbyBhIGZ1bsOnw6NvIGRlIGRldGVjw6fDo28gaGFsZi1ub3JtYWwgcGFyYSB1bSB0cnVuY2FtZW50byBkZSAxMCUgZG9zIGRhZG9zDQpjdXRpYXNfMjAxN19kaXN0YW5jZV9obiA8LSBjdXRpYXNfeWVhcl9kaXN0YW5jZSB8PiANCiAgZHBseXI6OmZpbHRlcih5ZWFyID09IDIwMTcpIHw+IA0KICBhanVzdGFyX21vZGVsb3NfRGlzdGFuY2UoDQogICAgZnVuY2FvX2NoYXZlID0gImhuIiwNCiAgICB0ZXJtb3NfYWp1c3RlID0gImNvcyIsDQogICAgdHJ1bmNhbWVudG8gPSAiMTAlIikNCmBgYA0KDQojIyMjIyMjICoqMjAxOCoqDQoNCmBgYHtyfQ0KIyBhanVzdGFuZG8gYSBmdW7Dp8OjbyBkZSBkZXRlY8Onw6NvIGhhbGYtbm9ybWFsIHBhcmEgdW0gdHJ1bmNhbWVudG8gZGUgMTAlIGRvcyBkYWRvcw0KY3V0aWFzXzIwMThfZGlzdGFuY2VfaG4gPC0gY3V0aWFzX3llYXJfZGlzdGFuY2UgfD4gDQogIGRwbHlyOjpmaWx0ZXIoeWVhciA9PSAyMDE4KSB8PiANCiAgYWp1c3Rhcl9tb2RlbG9zX0Rpc3RhbmNlKA0KICAgIGZ1bmNhb19jaGF2ZSA9ICJobiIsDQogICAgdGVybW9zX2FqdXN0ZSA9ICJjb3MiLA0KICAgIHRydW5jYW1lbnRvID0gIjEwJSIpDQpgYGANCg0KIyMjIyMjIyAqKjIwMTkqKg0KDQpgYGB7cn0NCiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYWxmLW5vcm1hbCBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDEwJSBkb3MgZGFkb3MNCmN1dGlhc18yMDE5X2Rpc3RhbmNlX2huIDwtIGN1dGlhc195ZWFyX2Rpc3RhbmNlIHw+IA0KICBkcGx5cjo6ZmlsdGVyKHllYXIgPT0gMjAxOSkgfD4gDQogIGFqdXN0YXJfbW9kZWxvc19EaXN0YW5jZSgNCiAgICBmdW5jYW9fY2hhdmUgPSAiaG4iLA0KICAgIHRlcm1vc19hanVzdGUgPSAiY29zIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KDQpgYGANCg0KIyMjIyMjIyAqKjIwMjAqKg0KDQpgYGB7cn0NCiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYWxmLW5vcm1hbCBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDEwJSBkb3MgZGFkb3MNCmN1dGlhc18yMDIwX2Rpc3RhbmNlX2huIDwtIGN1dGlhc195ZWFyX2Rpc3RhbmNlIHw+IA0KICBkcGx5cjo6ZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gDQogIGFqdXN0YXJfbW9kZWxvc19EaXN0YW5jZSgNCiAgICBmdW5jYW9fY2hhdmUgPSAiaG4iLA0KICAgIHRlcm1vc19hanVzdGUgPSAiY29zIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KDQpgYGANCg0KIyMjIyMjIyAqKjIwMjEqKg0KDQpgYGB7cn0NCiMgYWp1c3RhbmRvIGEgZnVuw6fDo28gZGUgZGV0ZWPDp8OjbyBoYWxmLW5vcm1hbCBwYXJhIHVtIHRydW5jYW1lbnRvIGRlIDEwJSBkb3MgZGFkb3MNCmN1dGlhc18yMDIxX2Rpc3RhbmNlX2huIDwtIGN1dGlhc195ZWFyX2Rpc3RhbmNlIHw+IA0KICBkcGx5cjo6ZmlsdGVyKHllYXIgPT0gMjAyMSkgfD4gDQogIGFqdXN0YXJfbW9kZWxvc19EaXN0YW5jZSgNCiAgICBmdW5jYW9fY2hhdmUgPSAiaG4iLA0KICAgIHRlcm1vc19hanVzdGUgPSAiY29zIiwNCiAgICB0cnVuY2FtZW50byA9ICIxMCUiKQ0KDQpgYGANCg0KIyMjIyMgQ29tcGFyYW5kbyBvcyBtb2RlbG9zDQoNCiMjIyMjIyBUYWJlbGEgY29tIG8gcmVzdW1vIGNvbXBhcmF0aXZvIGRvcyBtb2RlbG9zDQoNCmBgYHtyfQ0KbW9kZWxvX2N1dGlhc19lc3RyYXRfeWVhciA8LSBjb21wYXJhcl9haWNfbW9kZWxvX2VzdHJhdGlmaWNhZG8oDQogIGN1dGlhc19kaXN0YW5jZV95ZWFyX2huLA0KICBjdXRpYXNfMjAxNV9kaXN0YW5jZV9obiwNCiAgY3V0aWFzXzIwMTZfZGlzdGFuY2VfaG4sDQogIGN1dGlhc18yMDE3X2Rpc3RhbmNlX2huLA0KICBjdXRpYXNfMjAxOF9kaXN0YW5jZV9obiwgDQogIGN1dGlhc18yMDE5X2Rpc3RhbmNlX2huLCANCiAgY3V0aWFzXzIwMjBfZGlzdGFuY2VfaG4sIA0KICBjdXRpYXNfMjAyMV9kaXN0YW5jZV9obiwgDQogIG5vbWVfbW9kZWxvcyA9IGMoDQogIkdsb2JhbCIsDQogIjIwMTUiLA0KICIyMDE2IiwNCiAiMjAxNyIsDQogIjIwMTgiLA0KICIyMDE5IiwNCiAiMjAyMCIsDQogIjIwMjEiDQogICkNCikNCg0KDQptb2RlbG9fY3V0aWFzX2VzdHJhdF95ZWFyDQpgYGANCg0KIyMjIyMjIEdyw6FmaWNvcyBkZSBhanVzdGUgZGFzIGZ1bsOnw7VlcyBkZSBkZXRlw6fDo28gw6BzIHByb2JhYmlsaWRhZGVzIGRlIGRldGXDp8Ojbw0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCm1vZGVsb3NfY3V0aWFzX2VzdHJhdCA8LSBnZXJhcl9saXN0YV9tb2RlbG9zX3NlbGVjaW9uYWRvcygNCiAgY3V0aWFzX2Rpc3RhbmNlX3llYXJfaG4sDQogIGN1dGlhc18yMDE1X2Rpc3RhbmNlX2huLA0KICBjdXRpYXNfMjAxNl9kaXN0YW5jZV9obiwNCiAgY3V0aWFzXzIwMTdfZGlzdGFuY2VfaG4sDQogIGN1dGlhc18yMDE4X2Rpc3RhbmNlX2huLA0KICBjdXRpYXNfMjAxOV9kaXN0YW5jZV9obiwNCiAgY3V0aWFzXzIwMjBfZGlzdGFuY2VfaG4sDQogIGN1dGlhc18yMDIxX2Rpc3RhbmNlX2huLA0KICBub21lX21vZGVsb3Nfc2VsZWNpb25hZG9zID0gbW9kZWxvX2N1dGlhc19lc3RyYXQNCikNCg0KcGxvdGFyX2Z1bmNhb19kZXRlY2Nhb19tb2RlbG9zX3NlbGVjaW9uYWRvcyhtb2RlbG9zX2N1dGlhc19lc3RyYXQpDQpgYGANCg==